using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;

using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Generic;
using DEVOS.Generador;

public partial class Consultas : System.Web.UI.Page
{
    private static BD bdActual;
    private static Dictionary<String, BD> diccionarioBDs;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            this.CargaPagina();
        }
    }

    #region "Carga Pagina"
    private void CargaPagina()
    {
        Consultas.diccionarioBDs = AdministradorBD.DiccionarioBDs;

        #region "Cargar ddlBD"
        this.cargarDdlBD();
        #endregion

        #region "Cargar ddlTipos"
           this.cargarDdlTipos();
        #endregion

        #region "Cargar ddlTablas"
           this.cargarDdlTablas();
        #endregion

        #region "Cargar Procedimientos"
           this.cargarDdlProcedimientos();
        #endregion

        #region "Cargar ddlSentencia"
           this.cargarDdlSentencia();
        #endregion

        this.txtComando.Text = String.Empty;

        VerificaBloqueos();
    }

    private void cargarDdlBD()
    {
        this.ddlBD.Items.Clear();
        this.ddlBD.DataSource = diccionarioBDs.Values;
        this.ddlBD.DataTextField = "NombreBD";
        this.ddlBD.DataValueField = "NombreBD";
        this.ddlBD.DataBind();
        this.ddlBD.Items.Insert(0, new ListItem("-- Seleccione --", String.Empty));

    }

    private void cargarDdlTipos()
    {
        this.ddlTipo.Items.Clear();
        this.ddlTipo.Items.Insert(0, new ListItem("-- Seleccione Tipo --", String.Empty));
        this.ddlTipo.Items.Insert(1, new ListItem("Tabla", "T"));
        this.ddlTipo.Items.Insert(2, new ListItem("Stored Procedure", "P"));
    }

    private void cargarDdlTablas()
    {
        this.ddlTablas.Items.Clear();
        this.ddlTablas.Items.Insert(0, new ListItem("-- Listado --", String.Empty));
    }

    private void cargarDdlProcedimientos()
    {
        this.ddlProcedimientos.Items.Clear();
        this.ddlProcedimientos.Items.Insert(0, new ListItem("-- Listado --", String.Empty)); ;
    }

    private void cargarDdlSentencia()
    {
        this.ddlSentencia.Items.Clear();
        this.ddlSentencia.Items.Insert(0, new ListItem("-- Seleccione Sentencias --", String.Empty));
        this.ddlSentencia.Items.Insert(1, new ListItem("SELECT", "SELECT"));
        this.ddlSentencia.Items.Insert(2, new ListItem("INSERT", "INSERT"));
        this.ddlSentencia.Items.Insert(3, new ListItem("UPDATE", "UPDATE"));
        this.ddlSentencia.Items.Insert(4, new ListItem("DELETE", "DELETE"));
    }


    private void VerificaBloqueos()
    {
        String nombreBD = this.ddlBD.SelectedValue;
        bool esBDVacio = nombreBD.Equals(String.Empty);

        if (esBDVacio)
        {
            this.ddlTipo.SelectedIndex = 0;
            this.ddlTipo.Enabled = false;

            this.ddlTablas.SelectedIndex = 0;
            this.ddlTablas.Enabled = false;

            this.ddlProcedimientos.SelectedIndex = 0;
            this.ddlProcedimientos.Enabled = false; ;

            this.ddlSentencia.SelectedIndex = 0;
            this.ddlSentencia.Enabled = false;

            this.gvColumnas.DataSource = null;
            this.gvColumnas.Visible = false;

            this.lblProcedimiento.Text = String.Empty;
            this.lblProcedimiento.Visible = false;

            this.btnGenerar.Enabled = false;

            return;
        }
        else
        {
            this.ddlTipo.Enabled = true;
        }

        String tipo = this.ddlTipo.SelectedValue;
        bool esTipoVacio = tipo.Equals(String.Empty);

        if (esTipoVacio)
        {
            this.ddlTablas.SelectedIndex = 0;
            this.ddlTablas.Enabled = false;

            this.ddlProcedimientos.SelectedIndex = 0;
            this.ddlProcedimientos.Enabled = false;

            this.ddlSentencia.SelectedIndex = 0;
            this.ddlSentencia.Enabled = false;

            this.gvColumnas.DataSource = null;
            this.gvColumnas.Visible = false;

            this.lblProcedimiento.Text = String.Empty;
            this.lblProcedimiento.Visible = false;

            this.btnGenerar.Enabled = false;

            return;
        }
        else
        {
            if (tipo.Equals("T"))
            {
                this.ddlProcedimientos.SelectedIndex = 0;
                this.ddlProcedimientos.Enabled = false;

                this.lblProcedimiento.Text = String.Empty;
                this.lblProcedimiento.Visible = false;

                this.ddlTablas.Enabled = true;
            }
            else
            {
                this.ddlTablas.SelectedIndex = 0;
                this.ddlTablas.Enabled = false;

                this.gvColumnas.DataSource = null;
                this.gvColumnas.Visible = false;

                this.ddlSentencia.SelectedIndex = 0;
                this.ddlSentencia.Enabled = false;

                this.btnGenerar.Enabled = false;

                this.ddlProcedimientos.Enabled = true;
            }
        }

        String nombreTabla = this.ddlTablas.SelectedValue;
        bool esTablaVacia = nombreTabla.Equals(String.Empty);

        if (tipo.Equals("T"))
        {
            if (esTablaVacia)
            {
                this.ddlSentencia.SelectedIndex = 0;
                this.ddlSentencia.Enabled = false;

                this.gvColumnas.DataSource = null;
                this.gvColumnas.Visible = false;

                this.btnGenerar.Enabled = false;

                return;
            }
            else
            {
                this.gvColumnas.Visible = true;

                this.ddlSentencia.Enabled = true;
            }
        }

        String nombreProcedimiento = this.ddlProcedimientos.SelectedValue;
        bool esProcedimientoVacio = nombreProcedimiento.Equals(String.Empty);

        if (tipo.Equals("P"))
        {
            if (esProcedimientoVacio)
            {
                this.lblProcedimiento.Text = String.Empty;
                this.lblProcedimiento.Visible = false;

                return;
            }
            else
            {
                this.lblProcedimiento.Visible = true;
            }
        }

        String nombreSentencia = this.ddlSentencia.SelectedValue;
        bool esSentenciaVacia = nombreSentencia.Equals(String.Empty);

        this.btnGenerar.Enabled = !esSentenciaVacia;
    }

    private void MessageBox(string msg)
    {
        Label lbl = new Label();
        lbl.Text = "<script language='javascript'>" + Environment.NewLine + "window.alert('" + msg + "')</script>";
        Page.Controls.Add(lbl);
    }
    #endregion

    #region "Eventos"
    protected void ddlBD_SelectedIndexChanged(object sender, EventArgs e)
    {
        inicilizarObjetos(sender);
        VerificaBloqueos();
        if (!this.ddlBD.SelectedValue.Equals(String.Empty))
        {
            AdministradorBD.BDActual = new BD(this.ddlBD.SelectedValue);
            try
            {
                Consultas.bdActual = AdministradorBD.BDActual;
            }
            catch (Exception exc)
            {
                MessageBox(exc.Message);
            }
        }
    }

    protected void ddlTipo_SelectedIndexChanged(object sender, EventArgs e)
    {
        inicilizarObjetos(sender);
        VerificaBloqueos();

        String tipoSeleccionado = ddlTipo.SelectedValue;

        if (!tipoSeleccionado.Equals(String.Empty))
        {
            if (tipoSeleccionado.Equals("T"))
            {
                this.ddlTablas.Items.Clear();
                this.ddlTablas.DataSource = bdActual.DiccionarioTablas.Values;
                this.ddlTablas.DataTextField = "NombreTabla";
                this.ddlTablas.DataValueField = "NombreTabla";
                this.ddlTablas.DataBind();
                this.ddlTablas.Items.Insert(0, new ListItem("-- Listado --", String.Empty));
            }
            else
            {
                this.ddlProcedimientos.Items.Clear();
                this.ddlProcedimientos.DataSource = bdActual.DiccionarioProdecimientos.Values;
                this.ddlProcedimientos.DataTextField = "NombreProcedimiento";
                this.ddlProcedimientos.DataValueField = "NombreProcedimiento";
                this.ddlProcedimientos.DataBind();
                this.ddlProcedimientos.Items.Insert(0, new ListItem("-- Listado --", String.Empty));
            }
        }
    }

    protected void ddlTablas_SelectedIndexChanged(object sender, EventArgs e)
    {
        inicilizarObjetos(sender);
        VerificaBloqueos();

        if (!ddlTablas.SelectedValue.Equals(String.Empty))
        {
            this.gvColumnas.DataSource =
                (this.ddlTablas.SelectedValue.Equals(String.Empty)) ?
                null :
                Consultas.bdActual.DiccionarioTablas[this.ddlTablas.SelectedValue].ColumnasTabla;
            this.gvColumnas.DataBind();
        }
    }

    protected void ddlProcedimientos_SelectedIndexChanged(object sender, EventArgs e)
    {
        inicilizarObjetos(sender);
        VerificaBloqueos();

        if (!ddlProcedimientos.SelectedValue.Equals(String.Empty))
        {
            this.lblProcedimiento.Text = bdActual.DiccionarioProdecimientos[this.ddlProcedimientos.SelectedValue].TextoProcedimiento;
        }
    }

    protected void ddlSentencia_SelectedIndexChanged(object sender, EventArgs e)
    {
        VerificaBloqueos();
    }

    protected void btnGenerar_Click(object sender, EventArgs e)
    {
        List<String> campos = new List<String>();
        CheckBox checkBox;

        foreach (GridViewRow fila in gvColumnas.Rows)
        {
            checkBox = (CheckBox)fila.FindControl("chkColumna");
            if (checkBox != null && checkBox.Checked)
            {
                campos.Add(gvColumnas.DataKeys[fila.RowIndex].Value.ToString());
            }
        }
        txtComando.Text = GeneradorBD.Generar(ddlSentencia.SelectedValue, ddlTablas.SelectedValue, campos);
    }

    protected void btnConsultar_Click(object sender, EventArgs e)
    {
        DataSet ds = null;
        try
        {
            ds = AdministradorBD.getDataSet(this.ddlBD.SelectedValue, this.txtComando.Text);
            GridView gvResultado = null;
            for (int i = 0; i < ds.Tables.Count; i++)
            {
                gvResultado = new GridView();
                gvResultado.AllowPaging = false;
                gvResultado.AllowSorting = false;

                //gvResultado.DataSource = ds.Tables[i];
                gvResultado.DataSource = ds;
                gvResultado.DataBind();
               
                gvResultado.SkinID = "Grilla";
              //  gvResultado.SkinID = "Professional";

                divResultado.Controls.Add(gvResultado);
            }
        }
        catch (Exception exc)
        {
            MessageBox(exc.Message);
        }
    }





    protected void btnEjecutar_Click(object sender, EventArgs e)
    {
        int filasAfectadas = -1;
        try
        {
            filasAfectadas = AdministradorBD.ejecutar(this.ddlBD.SelectedValue, this.txtComando.Text);
            Label lblResultado = new Label();
            lblResultado.Text = String.Format( "{0} fila(s) afectada(s)", filasAfectadas.ToString());
            divResultado.Controls.Add(lblResultado);
        }
        catch (Exception exc)
        {
            MessageBox(exc.Message);
        }
    }


    public void inicilizarObjetos(Object objeto)
    {
        DropDownList ddpObjeto;
        ddpObjeto = (DropDownList) objeto;
        switch (ddpObjeto.ID)
        {
            
            case "ddlBD":
                this.cargarDdlTipos();
                this.cargarDdlTablas();
                this.cargarDdlProcedimientos();
                this.cargarDdlSentencia();
                break;
            case "ddlTipo":
                this.cargarDdlTablas();
                this.cargarDdlProcedimientos();
                this.cargarDdlSentencia();
                break;
            case "ddlTablas":
                this.cargarDdlProcedimientos();
                this.cargarDdlSentencia();
                break;
            default:
                this.cargarDdlSentencia();
                break;
        }
        this.txtComando.Text = "";

    }

    #endregion
}
